package com.study.principle;

/**
 * 6大设计原则：接口隔离原则
 *
 * 客户端不应该依赖它不需要的接口，一个类对另一个类的依赖应该建立在最小的接口上；
 * 当一个接口太大时，我们需要将它分割成一些更细小的接口（承担相对独立的角色），使用该接口的客户端仅需知道与之相关的方法即可；
 *
 * 单一职责原则要求的是类和接口职责单一，注重的是职责，这是业务逻辑上的划分；
 *
 * 接口隔离原则要求控制接口的粒度：
 *    * 接口不能太小，如果太小会导致系统中接口泛滥，不利于维护；
 *    * 接口不能太大，太大的接口将违背接口隔离原则，灵活性较差，使用起来很不方便。
 *
 * @Author 网易云课堂微专业-java高级开发工程师【allen老师】
 * @Version 1.0
 */
public class InterfaceSegregationPrinciple2 {
    public static void main(String[] args) {
        IOrderForPortal orderForPortal = Order.getOrderForPortal();
        IOrderForOtherSys orderForOtherSys = Order.getOrderForOtherSys();
        IOrderForAdmin orderForAdmin = Order.getOrderForAdmin();
        System.out.println("Portal门户调用方法:" + orderForPortal.getOrder());
        System.out.println("OtherSys外部系统调用方法:" + orderForOtherSys.insertOrder());
        System.out.println("Admin管理后台调用方法:" +
                orderForAdmin.getOrder() + ";" +
                orderForAdmin.insertOrder() + ";" +
                orderForAdmin.updateOrder() + ";" +
                orderForAdmin.deleteOrder());
    }
}

interface IOrderForPortal {
    String getOrder();
}

interface IOrderForOtherSys {
    String insertOrder();
    String getOrder();
}

interface IOrderForAdmin { //extendsIOrderForPortal,IOrderForOtherSys
    String deleteOrder();
    String updateOrder();
    String insertOrder();
    String getOrder();
}
/*

interface IOrderForPortal {
    String getOrder();
}

interface IOrderForOtherSys {
    String insertOrder();
}

interface IOrderForAdmin extends IOrderForPortal, IOrderForOtherSys {
    String updateOrder();
    String deleteOrder();
}
*/

class Order implements IOrderForPortal, IOrderForOtherSys, IOrderForAdmin {
    private Order() {
        // 什么都不干,就是为了不让直接 new,防止客户端直接New,然后访问它不需要的方法.
    }

    // 返回给Portal
    public static IOrderForPortal getOrderForPortal() {
        return (IOrderForPortal) new Order();
    }

    // 返回给OtherSys
    public static IOrderForOtherSys getOrderForOtherSys() {
        return (IOrderForOtherSys) new Order();
    }

    // 返回给Admin
    public static IOrderForAdmin getOrderForAdmin() {
        return (IOrderForAdmin) new Order();
    }

    // 下面是接口方法的实现.只是返回了一个String用于演示
    @Override
    public String getOrder() {
        return "implemented getOrder";
    }
    @Override
    public String insertOrder() {
        return "implemented insertOrder";
    }
    @Override
    public String updateOrder() {
        return "implemented updateOrder";
    }
    @Override
    public String deleteOrder() {
        return "implemented deleteOrder";
    }
}
